package cn.csc.module.pay.service.jzborder;

import cn.csc.framework.common.pojo.PageResult;
import cn.csc.framework.jzb.vo.JzbResponse;
import cn.csc.module.pay.api.order.dto.CreateDivideReqDTO;
import cn.csc.module.pay.api.order.dto.CreateDivideWithOrderItemIdReqDTO;
import cn.csc.module.pay.api.refund.dto.PayRefundCreateReqDTO;
import cn.csc.module.pay.controller.admin.jzborder.vo.JzbOrderExportReqVO;
import cn.csc.module.pay.controller.admin.jzborder.vo.JzbOrderPageReqVO;
import cn.csc.module.pay.controller.app.jzb.vo.OrderQueryReqVO;
import cn.csc.module.pay.controller.app.jzbtask.vo.AppPayJzbTaskPageReqVO;
import cn.csc.module.pay.dal.dataobject.jzborder.JzbOrderDO;
import cn.csc.module.pay.dal.dataobject.jzbsuborder.PayJzbSubOrderDO;
import cn.csc.module.pay.dal.dataobject.jzbtask.PayJzbTaskDO;
import cn.csc.module.pay.message.JzbOrderMessage;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Collection;
import java.util.List;

/**
 * 见证宝订单表(挂账) Service 接口
 *
 * @author 曾铁树
 */
public interface JzbOrderService {


    /**
     * 获得见证宝订单表(挂账)
     *
     * @param id 编号
     * @return 见证宝订单表(挂账)
     */
    JzbOrderDO getJzbOrder(BigInteger id);

    /**
     * 获得见证宝订单表(挂账)列表
     *
     * @param ids 编号
     * @return 见证宝订单表(挂账)列表
     */
    List<JzbOrderDO> getJzbOrderList(Collection<BigInteger> ids);

    /**
     * 获得见证宝订单表(挂账)分页
     *
     * @param pageReqVO 分页查询
     * @return 见证宝订单表(挂账)分页
     */
    PageResult<JzbOrderDO> getJzbOrderPage(JzbOrderPageReqVO pageReqVO);

    /**
     * 获得见证宝订单表(挂账)列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 见证宝订单表(挂账)列表
     */
    List<JzbOrderDO> getJzbOrderList(JzbOrderExportReqVO exportReqVO);

    /**
     * 冻结充值失败执行
     * @param createReqVO
     */
    Integer payFreezeJob(JzbOrderPageReqVO createReqVO);

    /**
     * 见证宝冻结
     * @param message
     */
    void createJzbFundDetails(JzbOrderMessage message);

    /**
     * 见证宝分账
     * @param
     */
    JzbResponse createDivide(OrderQueryReqVO reqVO);

    /**
     * 见证宝分账
     * @param reqVO 请求参数
     * @return
     */
    JzbResponse createDivideByOrderId(CreateDivideReqDTO reqVO);

    /**
     * 见证宝分账(商户订单号+订单项ID)
     * @param reqVO 请求参数
     * @return
     */
    JzbResponse createDivideByOrderItemId(CreateDivideWithOrderItemIdReqDTO reqVO);

    /**
     * 见证宝分账
     * @param
     */
    JzbResponse createDivide(PayJzbTaskDO jzbTaskDO);

    /**
     * 处理异常分账
     * @param subOrder
     * @return
     */
    JzbResponse dealAbnormalDivide(PayJzbSubOrderDO subOrder);

    /**
     * 添加定时分账任务
     */
    Long divideJob(JzbOrderPageReqVO pageReqVO);

    /**
     * 创建分账任务
     */
    JzbResponse createDivideTask(OrderQueryReqVO reqVO);

    /**
     * 退款
     * @param reqVO 退款请求参数
     * @return
     */
    JzbResponse jzbRefund(PayRefundCreateReqDTO reqVO);

    /**
     * 执行分账任务
     */
    Integer execDivideTask(AppPayJzbTaskPageReqVO pageReqVO);

    /**
     * 执行特殊分账任务
     */
    JzbResponse specialDivideTask(JzbOrderDO jzbOrderDO, String jzbCode, String amt);

    /**
     * 修复分账异常数据
     * @param reqVO
     * @return
     */
    Integer repairSubAccount(JzbOrderPageReqVO reqVO);

    JzbResponse resumeDivide(JzbOrderDO jzbOrderDO, BigDecimal resumeAmt);

}
